//T10004. 子集和问题
#include <iostream>
#include <cstdlib>

using namespace std;
const int MAXN=10000;
int n,c;
int s[MAXN+1];
int sub[MAXN+1];
int rsum[MAXN+1];

bool found=false;
void print(int k){
    for(int i=1;i<=k;i++) cout<<s[sub[i]]<<' ';
}
void search(int sum,int k,int next){
    if (k>n||sum>c) return;
    if (sum+rsum[next]<c) return;   //增加这个剪技，如果已选子集的和加上从当前这个位置到最后一个元素的和还小于c,
                                    //则无需继续搜下去
    for(int i=next;i<=n;i++){
        sub[k]=i;
        if (sum+s[i]==c){
            found=true;
            print(k);
            exit(0);
        }
        else if (sum+s[i]<c) search(sum+s[i],k+1,i+1);
    }
}
int main()
{
    cin>>n>>c;
    for(int i=1;i<=n;i++) cin>>s[i];
    //计算从最后一个元素到当前元素的累加和
    rsum[n]=s[n];
    for(int i=n-1;i>=1;i--) rsum[i]=rsum[i+1]+s[i];
    search(0,1,1);
    if (!found) cout<<"No Solution!";
} 
